#include "ModificacionGastoMensual.h"
#include "ui_ModificacionGastoMensual.h"

extern QSqlDatabase enjoylifedb;

extern QString current_user;
extern QString user_pablo;
extern QString user_lucas;
extern QString user__diego;

extern QSqlTableModel *gasto_mes_model;
extern QTableView *gasto_mes_view;

extern QLineEdit *gasto_mes_edit;
extern QLineEdit *deuda_mes_edit;
extern QLineEdit *gasto_mes_pablo_edit;
extern QLineEdit *gasto_mes_lucas_edit;
extern QLineEdit *gasto_mes_diego_edit;
extern QLineEdit *debe_pablo_edit;
extern QLineEdit *debe_lucas_edit;
extern QLineEdit *debe_diego_edit;

ModificacionGastoMensual::ModificacionGastoMensual(QWidget *parent) :
    QWidget(parent),
    local_gasto_mes_model(new QSqlTableModel(this,enjoylifedb)),
    ui(new Ui::ModificacionGastoMensual)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Modificación Gasto Mes");
    local_gasto_mes_model->setTable("gasto_mes");

    CargarConceptos();

    ui->estado_pago->addItem("Pagado");
    ui->estado_pago->addItem("Debe");

    ui->tipo_gasto->addItem("Mensual");
    ui->tipo_gasto->addItem("Esporádico");

    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

ModificacionGastoMensual::~ModificacionGastoMensual()
{
    delete ui;
}

void ModificacionGastoMensual::on_guardarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Gasto Mensual"),
                                   "¿Está seguro que quiere guardar los cambios?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {

        QString filter = "id_gasto_mes = '" + gasto_mes_model->index(row, 0).data().toString() + "'";
        gasto_mes_model->setFilter(filter);
        enjoylifedb.transaction();
        if (!(gasto_mes_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();

        if (gasto_mes_model->rowCount() == 1) {
            QSqlRecord record = gasto_mes_model->record(0);

            record.setValue("fecha_gasto",ui->fecha_gasto_edit->date());

            record.setValue("monto", ui->monto->text().toDouble());

            record.setValue("concepto", ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()));

            record.setValue("estado_pago",ui->estado_pago->currentText());

            record.setValue("tipo_gasto",ui->tipo_gasto->currentText());

            if (!ui->val_observaciones->toPlainText().isEmpty())
                record.setValue("observaciones", ui->val_observaciones->toPlainText());

            record.setValue("quien_pago", current_user);

            gasto_mes_model->setRecord(0, record);
            enjoylifedb.transaction();
            if (!local_gasto_mes_model->submitAll()) {
                QString error = local_gasto_mes_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del gasto, intentelo de nuevo."));
            enjoylifedb.rollback();
        }
    }

    RefreshModelView();
    ActualizarValoresGastosMes();

    close();
}

void ModificacionGastoMensual::RefreshGastosMesView()
{
    gasto_mes_view->hideColumn(0);
    gasto_mes_view->hideColumn(7);
    gasto_mes_model->setHeaderData(1,Qt::Horizontal,"Fecha Gasto");
    gasto_mes_model->setHeaderData(2,Qt::Horizontal,"Concepto");
    gasto_mes_model->setHeaderData(3,Qt::Horizontal,"Monto");
    gasto_mes_model->setHeaderData(4,Qt::Horizontal,"Estado Pago");
    gasto_mes_model->setHeaderData(5,Qt::Horizontal,"Tipo Gasto");
    gasto_mes_model->setHeaderData(6,Qt::Horizontal,"Observaciones");

    gasto_mes_view->setModel(gasto_mes_model);
    gasto_mes_view->setCornerButtonEnabled(true);
    gasto_mes_view->setAlternatingRowColors(true);
    gasto_mes_view->setGridStyle(Qt::SolidLine);
    gasto_mes_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    gasto_mes_view->setWordWrap(true);
    gasto_mes_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    gasto_mes_view->sortByColumn(1,Qt::SortOrder());
    gasto_mes_view->scrollToBottom();
}

void ModificacionGastoMensual::RefreshModelView()
{
    QDate date;
    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
    QString formatMonth = "MM";
    QString month = date.toString(formatMonth);

    QString filtro_gasto = "date_part('month', fecha_gasto) = '";
    filtro_gasto.append(month).append("'");

    gasto_mes_model->setTable("gasto_mes");
    gasto_mes_model->filter().clear();
    gasto_mes_model->setFilter(filtro_gasto);

    enjoylifedb.transaction();
    if (! gasto_mes_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    RefreshGastosMesView();
}

void ModificacionGastoMensual::GetGastoMensualInfo(int index)
{
    row = index;
    ui->fecha_gasto_edit->setDate(gasto_mes_model->index(index,1).data().toDate());
    ui->comboBox_concepto->setCurrentText(gasto_mes_model->index(index, 2).data().toString());
    ui->monto->setText(QString("%1").arg(gasto_mes_model->index(index,3).data().toDouble(), 0, 'f', 2));
    ui->estado_pago->setCurrentIndex(ui->estado_pago->findData(gasto_mes_model->index(index,4).data().toString(),Qt::DisplayRole));
    ui->tipo_gasto->setCurrentIndex(ui->tipo_gasto->findData(gasto_mes_model->index(index,5).data().toString(),Qt::DisplayRole));
    ui->val_observaciones->setText(gasto_mes_model->index(index,6).data().toString());
}

void ModificacionGastoMensual::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto where tipo_concepto = 'Interno' order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto->addItem("");
    while (query->next()) {
        ui->comboBox_concepto->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

void ModificacionGastoMensual::on_fecha_gasto_edit_dateChanged(const QDate &date)
{
    if ((date.month() != QDate::currentDate().month()) && (date.year() == date.year())) {
        QMessageBox::critical(this,"Error!", "El mes debe coincidir con el mes actual");
        ui->fecha_gasto_edit->setDate(QDate::currentDate());
        return;
    }
}

void ModificacionGastoMensual::ActualizarValoresGastosMes()
{
    // Gasto total mes
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString str;
    str.append("select sum(monto) from gasto_mes where (EXTRACT(MONTH from fecha_gasto)) = '");
    str.append(QString::number(QDate::currentDate().month())).append("'");

    if (! query->exec(str)) {
        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
        return;
    }

    double suma_gastos = -1;
    double gastos_divididos = -1;
    while (query->next())
        suma_gastos = query->value(0).toDouble();

    gastos_divididos = (suma_gastos / 3);

    const int precision = 2;
    gasto_mes_edit->clear();
    gasto_mes_edit->setText(QString("%1").arg(suma_gastos, 0, 'f', precision));

    // Gastos Pablo
    QSqlQuery *queryGastosPablo = new QSqlQuery(enjoylifedb);
    QString strGastosPablo;
    strGastosPablo.append("select sum(monto) from gasto_mes where quien_pago like '%");
    strGastosPablo.append("Pablo").append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosPablo.append(QString::number(QDate::currentDate().month())).append("'");
    if (! queryGastosPablo->exec(strGastosPablo)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosPablo->lastError().text());
        return;
    }

    double gastos_pablo = -1;
    while (queryGastosPablo->next())
        gastos_pablo = queryGastosPablo->value(0).toDouble();

    gasto_mes_pablo_edit->clear();
    gasto_mes_pablo_edit->setText(QString("%1").arg(gastos_pablo, 0, 'f', precision));

    // Gastos Lucas
    QSqlQuery *queryGastosLucas = new QSqlQuery(enjoylifedb);
    QString strGastosLucas;
    strGastosLucas.append("select sum(monto) from gasto_mes where quien_pago like '%");
    strGastosLucas.append("Lucas").append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosLucas.append(QString::number(QDate::currentDate().month())).append("'");
    if (! queryGastosLucas->exec(strGastosLucas)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosLucas->lastError().text());
        return;
    }

    double gastos_lucas = -1;
    while (queryGastosLucas->next())
        gastos_lucas = queryGastosLucas->value(0).toDouble();

    gasto_mes_lucas_edit->clear();
    gasto_mes_lucas_edit->setText(QString("%1").arg(gastos_lucas, 0, 'f', precision));

    // Gastos Diego
    QSqlQuery *queryGastosDiego = new QSqlQuery(enjoylifedb);
    QString strGastosDiego;
    strGastosDiego.append("select sum(monto) from gasto_mes where quien_pago like '%");
    strGastosDiego.append("Diego").append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosDiego.append(QString::number(QDate::currentDate().month())).append("'");
    if (! queryGastosDiego->exec(strGastosDiego)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosDiego->lastError().text());
        return;
    }

    double gastos_diego = -1;
    while (queryGastosDiego->next())
        gastos_diego = queryGastosDiego->value(0).toDouble();

    gasto_mes_diego_edit->clear();
    gasto_mes_diego_edit->setText(QString("%1").arg(gastos_diego, 0, 'f', precision));

    //**************************************************************************
    double dif_gasto_pablo = gastos_pablo - gastos_divididos;
    double dif_gasto_lucas = gastos_lucas - gastos_divididos;
    double dif_gasto_diego = gastos_diego - gastos_divididos;

    deuda_mes_edit->clear();
    debe_pablo_edit->clear();
    debe_lucas_edit->clear();
    debe_diego_edit->clear();
    // Deuda de pablo
    if (dif_gasto_pablo >= 0) {
        debe_pablo_edit->setText(QString("%1").arg(dif_gasto_pablo, 0, 'f', precision));
        debe_pablo_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    } else {
        debe_pablo_edit->setText(QString("%1").arg(dif_gasto_pablo, 0, 'f', precision));
        debe_pablo_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    // Deuda de lucas
    if (dif_gasto_lucas >= 0) {
        debe_lucas_edit->setText(QString("%1").arg(dif_gasto_lucas, 0, 'f', precision));
        debe_lucas_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    else {
        debe_lucas_edit->setText(QString("%1").arg(dif_gasto_lucas, 0, 'f', precision));
        debe_lucas_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    // Deuda de Diego
    if (dif_gasto_diego >= 0) {
        debe_diego_edit->setText(QString("%1").arg(dif_gasto_diego, 0, 'f', precision));
        debe_diego_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    else {
        debe_diego_edit->setText(QString("%1").arg(dif_gasto_diego, 0, 'f', precision));
        debe_diego_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }

    // Deuda Total Mes
    QSqlQuery* queryDeudaTotalMes = new QSqlQuery(enjoylifedb);
    QString strDeudaTotalMes;
    strDeudaTotalMes.append("select sum(monto) from gasto_mes where estado_pago = 'Debe' and ");
    strDeudaTotalMes.append("(EXTRACT(MONTH from fecha_gasto)) = '");
    strDeudaTotalMes.append(QString::number(QDate::currentDate().month())).append("'");

    if (! queryDeudaTotalMes->exec(strDeudaTotalMes)) {
        QMessageBox::critical(this,"Error en la consulta",queryDeudaTotalMes->lastError().text());
        return;
    }

    double suma_saldo2 = -1;
    while (queryDeudaTotalMes->next())
        suma_saldo2 = queryDeudaTotalMes->value(0).toDouble();

    deuda_mes_edit->setText(QString("%1").arg(suma_saldo2, 0, 'f', precision));
}
